export class Vector {
  constructor(public x: number, public y: number) { }

  /** 返回新的向量 */
  copy () {
    return new Vector(this.x, this.y);
  }

  /** 当前向量的长度 */
  length () {
    return Math.sqrt(this.x * this.x + this.y * this.y);
  }

  /** 单位向量 */
  normalize () {
    var inv = 1 / this.length();
    return new Vector(this.x * inv, this.y * inv);
  }

  /** 反向向量 */
  negate () {
    return new Vector(-this.x, -this.y);
  }

  /** 向量和 */
  add (v: Vector) {
    return new Vector(this.x + v.x, this.y + v.y);
  }

  /** 向量差 */
  subtract (v: Vector) {
    return new Vector(this.x - v.x, this.y - v.y);
  }

  /** 向量积  */
  multiply (f: number) {
    return new Vector(this.x * f, this.y * f);
  }

  /** 向量方向化 */
  divide (f: number) {
    var invf = 1 / f;
    return new Vector(this.x * invf, this.y * invf);
  }

  /** 点积 */
  dot (v: Vector) {
    return this.x * v.x + this.y * v.y;
  }

  move (v: Vector) {
    this.x = v.x;
    this.y = v.y;
    return this;
  }

  /** 法向量 */
  prependicular () {
    return new Vector(this.y, -this.x);
  }

  rotate (angle = 0) {
    var _angle = angle / 180 * Math.PI;
    this.x = this.x * Math.cos(_angle) - this.y * Math.sin(_angle);
    this.y = this.x * Math.sin(_angle) + this.y * Math.cos(_angle);
  }
}
